package cn.com.bod.fas.common.exception;

import java.util.List;

import cn.com.bod.fas.common.constant.enumconst.ResultCodeEnum;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

import cn.com.bod.fas.common.utils.ResultUtil;
import cn.com.yusys.yusp.commons.web.rest.dto.ResultDto;
import lombok.extern.slf4j.Slf4j;



/**
 * @description 全局统一异常处理 
 * @author chenyuanxian
 * @date 2019年9月15日 下午9:47:35
 * @version 1.0.0
 * @Copyright (c) scfhdt
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
	
	@Autowired
	ResultUtil resultUtil;

//    @Value("${spring.servlet.multipart.max-file-size}")
//    private String maxFileSize;
    
//    @ExceptionHandler(value = HttpMediaTypeNotSupportedException.class)
//    public Result<Void> handleException(HttpMediaTypeNotSupportedException ex) {
//        log.error("不支持当前媒体类型：{}", ExceptionUtils.getStackTrace(ex));
//        return ResultUtil.error(ResultCodeEnum.HTTP_MEDIA_TYPE_NOT_SUPPORTED);
//    }
//
//    @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
//    public ResultDto<Void> handleException(
//            HttpRequestMethodNotSupportedException ex) {
//        log.error("不支持当前请求方法：{}", ExceptionUtils.getStackTrace(ex));
//        //return ResultUtil.error(ResultCodeEnum.HTTP_REQUEST_METHOD_NOT_SUPPORTED);
//        return ResultDto.createFailure(ResultCodeEnum.HTTP_REQUEST_METHOD_NOT_SUPPORTED.getCode(),
//        		ResultCodeEnum.HTTP_REQUEST_METHOD_NOT_SUPPORTED.getMsg());
//    }

    @ExceptionHandler(value = HttpMessageNotReadableException.class)
    public ResultDto<Void> handleException(HttpMessageNotReadableException ex) {
        log.error("参数解析失败：{}", ExceptionUtils.getStackTrace(ex));
        //return ResultUtil.error(ResultCodeEnum.PARAM_RESLOVE_FAIL);
        return ResultDto.createFailure(ResultCodeEnum.PARAM_RESLOVE_FAIL.getCode(), ResultCodeEnum.PARAM_RESLOVE_FAIL.getMsg());
    }
    
    /**
     * @description 处理参数校验异常. 
     * @author chenyuanxian
     * @date 2019年9月15日 下午10:01:22
     * @param ex 参数校验异常
     * @return 响应报文对象
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResultDto<Void> handleException(MethodArgumentNotValidException ex) {
        String message = "";
        BindingResult result = ex.getBindingResult();
        if (result.hasErrors()) {
            List<ObjectError> errorList = result.getAllErrors();
            for (ObjectError error : errorList) {
                log.info("参数校验失败：{}---{}---{}", error.getCode(),
                        error.getObjectName(), error.getDefaultMessage());
                message = error.getDefaultMessage();
                break;
            }
        }
        return resultUtil.paramError(message);
    }
    
    /**
     * @description  处理上传文件超过大小限制异常.
     * @author chenyuanxian
     * @date 2019年9月15日 下午9:59:15
     * @param ex 上传文件超过大小限制异常
     * @return 响应报文对象
     */
    @ExceptionHandler(value = MaxUploadSizeExceededException.class)
    public ResultDto<Void> handleException(MaxUploadSizeExceededException ex) {
        log.error("文件上传异常：{}", ExceptionUtils.getStackTrace(ex));
//        return ResultUtil.error(ResultCodeEnum.UPLOAD_FILE_EXCEED_MAX_SIZE.getCode(),
//                ResultCodeEnum.UPLOAD_FILE_EXCEED_MAX_SIZE.getMsg() + maxFileSize);
        return ResultDto.createFailure(ResultCodeEnum.UPLOAD_FILE_EXCEED_MAX_SIZE.getCode(),
        		ResultCodeEnum.UPLOAD_FILE_EXCEED_MAX_SIZE.getMsg());
    }
    
//    /**
//     * @description 处理押品管理服务业务异常. 
//     * @author chenyuanxian
//     * @date 2019年9月15日 下午9:56:23
//     * @param ex 押品管理服务业务异常
//     * @return 响应报文对象
//     */
//    @ExceptionHandler(value = PledgeException.class)
//    public ResultDto<Void> handleException(PledgeException ex) {
//        log.debug("押品管理服务业务异常：{}", ExceptionUtils.getStackTrace(ex));
//        //return ResultUtil.error(ex.getCode(), ex.getMessage());
//        return ResultDto.createFailure(ex.getCode(), ex.getMessage());
//    }
    
    /**
     * @description 处理公共基础业务异常. 
     * @author chenyuanxian
     * @date 2019年9月15日 下午9:54:56
     * @param ex 公共基础业务异常
     * @return 响应报文对象
     */
    @ExceptionHandler(value = BaseException.class)
    public ResultDto<Void> handleException(BaseException ex) {
        log.error("公共基础业务异常：{}", ExceptionUtils.getStackTrace(ex));
        //return ResultUtil.error(ex.getCode(), ex.getMessage());
        return ResultDto.createFailure(ex.getCode(), ex.getMessage());
    }
    
    /**
     * @description 默认异常处理. 
     * @author chenyuanxian
     * @date 2019年9月15日 下午9:53:25
     * @param ex 默认异常
     * @return 响应报文对象
     */
    @ExceptionHandler(value = Exception.class)
    public ResultDto<Void> handleException(Exception ex) {
        log.error("系统异常：{}", ExceptionUtils.getStackTrace(ex));
        //return ResultUtil.error(ResultCodeEnum.ERROR);
        return ResultDto.createFailure(ResultCodeEnum.ERROR.getCode(), ResultCodeEnum.ERROR.getMsg());
    }
}
